# coding:utf-8

import re

from . import api
from iHome import redis_store, db
from iHome.models import User
from iHome.utils.response_code import RET
from iHome.utils.commons import login_required
from flask import request, jsonify, current_app, session, g


@api.route("/session", methods=["DELETE"])
def logout():
    """退出登录"""
    session.pop('user_id', None)
    session.pop('mobile', None)
    session.pop('name', None)

    return jsonify(errno=RET.OK, errmsg="OK")


# 注册模块视图函数
@api.route('/users', methods=["POST"])
def register():
    """注册接口"""
    mobile = request.json.get("mobile")
    phonecode = request.json.get("phonecode")
    password = request.json.get("password")
    password2 = request.json.get("password2")
    # 1.参数非空判断
    if not all([mobile, phonecode, password, password2]):
        return jsonify(errno=RET.PARAMERR, errmsg="注册参数不足")
    # 2.手机格式校验
    if not re.match(r'1[345678][0-9]{9}', mobile):
        return jsonify(errno=RET.PARAMERR, errmsg="手机号码错误,请重新输入")
    # 3.取出redis中保存的短信验证码
    real_sms_code = None
    try:
        real_sms_code = redis_store.get("SMSCode_" + mobile)
    except Exception as err:
        current_app.logger.error(err)
    # 3.1 如果存在,则删除redis中数据
    if real_sms_code:
        redis_store.delete("SMSCode_" + mobile)
    else:
        # 不存在则短信验证码已过期
        return jsonify(errno=RET.NODATA, errmsg="短信验证码已过期")
    # 比较取到的短信验证码和用户输入的短信验证码比较
    if real_sms_code != phonecode:
        return jsonify(errno=RET.DATAERR, errmsg="短信验证码错误")
    if password != password2:
        return jsonify(errno=RET.DATAERR, errmsg="两次密码不一致")
    # 创建用户
    user = User()
    user.name = mobile
    user.mobile = mobile
    user.password = password
    # 添加到数据库
    try:
        db.session.add(user)
        db.session.commit()
    except Exception as err:
        current_app.logger.error(err)
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg="保存用户信息失败")
    # 保存用户信息做状态保持
    session["user_id"] = user.id
    session["name"] = user.name
    session["mobile"] = user.mobile
    return jsonify(errno=RET.OK, errmsg="注册成功")


@api.route("/session", methods=["POST"])
def login():
    """登录接口"""
    # 获取参数：手机号 密码
    mobile = request.json.get('mobile')
    password = request.json.get('password')
    # 非空判断
    if not all([mobile, password]):
        return jsonify(errno=RET.PARAMERR, errmsg='参数不足')
    # 手机号码格式判断
    if not re.match(r"1[3546789][0-9]{9}", mobile):
        return jsonify(errno=RET.PARAMERR, errmsg="手机号码格式错误")
    # 根据手机号码查询当前用户对象
    user = None  # type:User
    try:
        user = User.query.filter(User.mobile == mobile).first()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='数据库查询错误')
    # 判断用户是否存在
    if not user:
        return jsonify(errno=RET.USERERR, errmsg='用户不存在')
    # 若用户存在，判断用户输入密码是否正确
    if not user.check_password(password):
        return jsonify(errno=RET.PWDERR, errmsg='密码错误')

    # 保存用户登录状态
    session['user_id'] = user.id
    session['name'] = user.name
    session['mobile'] = user.mobile

    return jsonify(errno=RET.OK, errmsg='登录成功')


@api.route("/session")
@login_required
def check_login():
    """检查登录"""
    user_id = g.user_id
    user = None  # type: User
    try:
        user = User.query.get(user_id)
    except Exception as err:
        current_app.logger.error(err)
    data = {
        "name": user.name,
        "user_id": user_id
    }
    return jsonify(errno=RET.OK, errmsg="OK", data=data)
